#pragma once

#include <Arduino.h>
#include "Screen.h"
#include "Keys.h"
#include "pins_config.h"

// 飞机大战游戏类
class Plane {
public:
  // 游戏入口
  void main(Screen &screen, Keys &keys);

private:
  // 玩家飞机
  static const int PLAYER_WIDTH = 20;     // 玩家飞机宽度
  static const int PLAYER_HEIGHT = 24;    // 玩家飞机高度
  static const int PLAYER_SPEED = 6;      // 玩家飞机移动速度
  static const int PLAYER_START_Y = 450;  // 玩家飞机初始Y位置

  // 敌机
  static const int ENEMY_WIDTH = 16;             // 敌机宽度
  static const int ENEMY_HEIGHT = 16;            // 敌机高度
  static const int ENEMY_SPEED = 2;              // 敌机移动速度
  static const int MAX_ENEMIES = 6;              // 最大敌机数量
  static const int ENEMY_SPAWN_INTERVAL = 1500;  // 敌机生成间隔（毫秒）

  // 子弹
  static const int BULLET_WIDTH = 3;     // 子弹宽度
  static const int BULLET_HEIGHT = 8;    // 子弹高度
  static const int BULLET_SPEED = 6;     // 子弹移动速度
  static const int MAX_BULLETS = 10;     // 最大子弹数量
  static const int FIRE_INTERVAL = 200;  // 发射间隔（毫秒）

  // 爆炸效果
  static const int EXPLOSION_FRAMES = 8;      // 爆炸动画帧数
  static const int EXPLOSION_DURATION = 400;  // 爆炸持续时间（毫秒）

  // 游戏区域
  static const int GAME_TOP = 40;             // 游戏区域顶部
  static const int INFO_X = 5;                // 信息显示Y位置
  static const int INFO_Y = 2;                // 信息显示Y位置
  static const int INFO_V_Y = INFO_Y + 20;    // 信息显示Y位置
  static const int LIVES_X = 81;              // 生命值显示X位置
  static const int LIVES_Y = 2;               // 生命值显示Y位置
  static const int LIVES_V_Y = LIVES_Y + 20;  // 生命值显示Y位置
  static const int KILLS_X = LIVES_X + 81;    // 击毁敌机数显示X位置
  static const int KILLS_Y = 2;               // 击毁敌机数显示Y位置
  static const int KILLS_V_Y = KILLS_Y + 20;  // 击毁敌机数显示Y位置

  // 游戏状态
  enum GameState {
    PLAYING,   // 游戏中
    PAUSED,    // 暂停
    GAME_OVER  // 游戏结束
  };

  // 子弹结构
  struct Bullet {
    float x;
    float y;
    bool active;
  };

  // 敌机结构
  struct Enemy {
    float x;
    float y;
    bool active;
    int type;  // 敌机类型（0-2，不同类型不同分数）
  };

  // 爆炸效果结构
  struct Explosion {
    int x;
    int y;
    unsigned long startTime;
    bool active;
  };

  // 游戏变量
  GameState state;

  // 玩家飞机
  float playerX;
  float playerY;

  // 子弹数组
  Bullet bullets[MAX_BULLETS];

  // 敌机数组
  Enemy enemies[MAX_ENEMIES];

  // 爆炸效果
  Explosion explosions[MAX_ENEMIES];

  // 游戏数据
  unsigned long score;
  int lives;             // 生命值
  int enemiesDestroyed;  // 击毁敌机数

  // 时间控制
  unsigned long lastUpdateTime;
  unsigned long lastFireTime;
  unsigned long lastEnemySpawnTime;

  // 初始化游戏
  void initGame();

  // 绘制函数
  void drawGameArea(Screen &screen);
  void drawPlayer(Screen &screen);
  void drawBullets(Screen &screen);
  void drawEnemies(Screen &screen);
  void drawExplosions(Screen &screen);
  void drawInfo(Screen &screen);
  void drawPausedMessage(Screen &screen);
  void drawGameOver(Screen &screen);

  // 游戏逻辑
  void updateGame();
  void movePlayer(int dx, int dy);     // 移动玩家飞机
  void fireBullet();                   // 发射子弹
  void updateBullets();                // 更新子弹位置
  void spawnEnemy();                   // 生成敌机
  void updateEnemies();                // 更新敌机位置
  void updateExplosions();             // 更新爆炸效果
  void checkCollisions();              // 检查碰撞
  void createExplosion(int x, int y);  // 创建爆炸效果

  // 输入处理
  void handleInput(Keys &keys);

  // 工具函数
  int getEnemyScore(int type);       // 获取敌机分数
  uint16_t getEnemyColor(int type);  // 获取敌机颜色
};
